#ifndef _SDLJEU_H
#define _SDLJEU_H

#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include "Jeu.h"
#include "Sprite.h"
#include "assert.h"
#include "Score.h"
#include <time.h>

#define LARGEUR_FENETRE 1800
#define HAUTEUR_FENETRE 415
#define CACHE_SIZE 5000


/**
@struct Input SdlJeu.h "~/lif7-projet-jetpack/src/SdlJeu.h" Structure définissant le Input. \n
*/

struct sInput
{
	char key[SDLK_LAST];
};
typedef struct sInput Input;


/**
@struct TilesetStruc SdlJeu.h "~/lif7-projet-jetpack/src/SdlJeu.h" Structure définissant le TilesetStruct. \n
*/
typedef struct
{
	int LARGEUR_TILE,HAUTEUR_TILE;
	SDL_Surface* tileset;
	SDL_Rect* props;
}  TilesetStruct;


/**
@struct sdlJeu SdlJeu.h "~/lif7-projet-jetpack/src/SdlJeu.h" Structure définissant le sdlJeu. \n
*/
typedef struct
{
    TilesetStruct sTile;
    Jeu Jeu;
    Sprite* perso;
	SDL_Surface* screen;
	Input in;
} sdlJeu;



/**
@brief <B> Brief Description </B> Analyse l'état des events. \n
@details <B> Description </B> Met l si la touche est enfoncée et 0 sinon,tant qu'il y a un event. \n
@param[in,out] Input Pointeur sur in. \n
*/
void updateEvents(Input* in);

/**
@brief <B> Brief Description </B> Charge une image. \n
@details <B> Description </B> Permet de charger une image au format BMP dans une SDL_Surface.. \n
@param[in,out] SDL_Surface Pointeur sur tileset. \n
@param[in,out] char Pointeur sur fichier_image. \n
*/
SDL_Surface* LoadImage32(const char* fichier_image);

/**
@brief <B> Brief Description </B> Initialise in. \n
@details <B> Description </B> initEvents permet de remplir une zone mémoire avec le caractère "0". \n
@param[in,out] Input Pointeur sur in. \n
*/
void initEvents(Input* in);

/**
@brief <B> Brief Description </B> Fait tourner le jeu sous SDL. \n
@details <B> Description </B> Boucle qui permet de faire évoluer le jeu sous SDL. \n
@param[in,out] sdlJeu Pointeur sur Sj. \n
*/
void sdljeuBoucle(sdlJeu * Sj);

/**
@brief <B> Brief Description </B> Initialise le SDL. \n
@param[in,out] sdlJeu Pointeur sur pSj. \n
*/
void sdlInit(sdlJeu * pSj);

/**
@brief <B> Brief Description </B> Libère SDL. \n
@param[in,out] sdlJeu Pointeur sur pSj. \n
*/
void sdlLibere(sdlJeu * pSj);

/**
@brief <B> Brief Description </B> Affiche le score. \n
@details <B> Description </B> Affiche le score durant la partie. \n
@param[in] Entier Sscore. \n
@param[in] SDL_Color Couleur. \n
@param[in,out] SDL_Surface Pointeur sur screen. \n
@param[in,out] TTF_Font Pointeur sur Snorlax. \n
*/
void AfficherScoreSDL(int Sscore,SDL_Surface* screen,TTF_Font *Snorlax,SDL_Color Noir);

/**
@brief <B> Brief Description </B> Charge les tileset. \n
@details <B> Description </B> Charge en mémoire les tilesets des fichiers textes et test s'ils sont pleins. \n
@param[in,out] FILE Pointeur sur F. \n
@param[in,out] Terrain Pointeur sur pTer. \n
@param[in,out] TilesetStruct Pointeur sur pTile. \n
*/
void chargerTilesetSDL(FILE* F,Terrain* pTer, TilesetStruct * pTile);

/**
@brief <B> Brief Description </B> Affiche un sprite. \n
@details <B> Description </B> Récupère les paramètres de fenêtrage, et affiche le sprite perso. \n
@param[in] Sprite Pointeur sur perso. \n
@param[in] SDL_Surface Pointeur sur screen. \n
@return Retourne un entier. \n
*/
int AfficherSprite(Sprite* perso,SDL_Surface* screen);

/**
@brief <B> Brief Description </B> Affiche la carte. \n </B>
@details <B> Description </B> Permet d'afficher la carte. \n
@param[in,out] Terrain Pointeur sur pTer. \n
@param[in,out] SDL_Surface Pointeur sur screen. \n
@param[in,out] Sprite Pointeur sur pSprite. \n
@param[in,out] TilesetStruct Pointeur sur pTile. \n
@return Retourne un entier. \n
*/
int AfficherMapSDL(Terrain* pTer,SDL_Surface* screen, Sprite * pSprite, TilesetStruct * pTile);

/**
@brief <B> Brief Description </B> Initialise les tilesets. \n </B>
@details <B> Description </B> Initialise le fichier texte et lance chargerTilesetSDL. \n
@param[in,out] Terrain Pointeur sur pTer. \n
@param[in,out] TilesetStruct Pointeur sur pTile. \n
@param[in,out] char Pointeur sur level. \n
*/
void tilesetInit(const char * level, Terrain * pTer, TilesetStruct * pTile);

/**
@brief <B> Brief Description </B> Affiche le menu de fin de partie. \n </B>
@details <B> Description </B> Permet d'afficher le menu de fin de partie pour revenir au menu principal. \n
@param[in,out] SDL_Surface Pointeur sur ecran. \n
@param[in,out] TTF_Font Pointeur sur Mario. \n
@param[in,out] TTF_Font Pointeur sur Snorlax. \n
@param[in] SDL_Color Couleur Noir. \n
@param[in] SDL_Color Couleur Rouge. \n
*/
void MenuFinJeu(SDL_Surface *ecran, TTF_Font *Mario,TTF_Font *Snorlax,
                  SDL_Color Noir, SDL_Color Rouge,int score,sdlJeu *pSj,Terrain cartefin);

#endif
